package com.suntoon.framework.file;

import cn.hutool.core.util.ZipUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.IOException;

/**
 * @Author: LEAVES
 * @Version 1.0
 * @Date: 2021年06月25日 14时31分24秒
 * @Description: 文件处理工具类
 */
@Slf4j
@Component
public class FileUtil {

    /**
     * 创建多级文件目录
     *
     * @param path 目标路径
     */
    public void createFolder(String path) {
        File dir = new File(path);
        // 判断目录是否存在
        if (!dir.exists()) {
            //创建单级目录
//            dir.mkdir();
            //创建多级目录
            dir.mkdirs();
            log.info("目录创建成功：" + path);
        }

    }

    /**
     * 压缩目录
     * <p>
     * 将源目标目录（包括其内文件或文件夹）打成压缩包
     *
     * @param zipName      压缩包名称
     * @param resourceName 源文件名称
     * @param timestamp    压缩包存放目录
     * @return
     */
    public String toZip(String zipName, String resourceName, String PATH, String timestamp) {
        //压缩包名称
        String ZIP_NAME = zipName + ".zip";
        log.info("压缩包名称：" + ZIP_NAME);
        //压缩包所在目录
        String FILE_PATH = PATH + timestamp + "/";
        log.info("压缩包所在目录：" + FILE_PATH);
        //源目录路径
        String SOURCE_FILE_PATH = PATH + resourceName;
        log.info("源目录路径：" + SOURCE_FILE_PATH);
        //目标文件路径
        String TARGET_PATH = FILE_PATH + ZIP_NAME;
        log.info("目标路径：" + TARGET_PATH);
        //创建压缩包所在目录
        createFolder(FILE_PATH);
        log.info("创建压缩包所在目录：" + FILE_PATH);
        //压缩
        ZipUtil.zip(SOURCE_FILE_PATH, TARGET_PATH);
        log.info("压缩成功：" + TARGET_PATH);
        return TARGET_PATH;
    }

    /***
     * 删除文件夹
     *
     * @param folderPath 文件夹完整绝对路径
     */
    public void delFolder(String folderPath) {
        try {
            System.out.println("删除完里面所有内容 = folderPath --->" + folderPath);
            // 删除完里面所有内容
            delAllFile(folderPath);
            String filePath = folderPath;
            filePath = filePath.toString();
            java.io.File myFilePath = new java.io.File(filePath);
            // 删除空文件夹
            myFilePath.delete();
            System.out.println("删除空文件夹");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /***
     * 删除指定文件夹下所有文件
     *
     * @param path 文件夹完整绝对路径
     * @return
     */
    public boolean delAllFile(String path) {
        boolean flag = false;
        File file = new File(path);
        if (!file.exists()) {
            return flag;
        }
        if (!file.isDirectory()) {
            return flag;
        }
        String[] tempList = file.list();
        File temp = null;
        for (int i = 0; i < tempList.length; i++) {
            if (path.endsWith(File.separator)) {
                temp = new File(path + tempList[i]);
            } else {
                temp = new File(path + File.separator + tempList[i]);
            }
            if (temp.isFile()) {
                temp.delete();
            }
            if (temp.isDirectory()) {
                // 先删除文件夹里面的文件
                delAllFile(path + "/" + tempList[i]);
                // 再删除空文件夹
                delFolder(path + "/" + tempList[i]);
                flag = true;
            }
        }
        return flag;
    }

    /**
     * MultipartFile转File
     *
     * @param multipartFile
     * @return
     */
    public File transferToFile(MultipartFile multipartFile) {
//        选择用缓冲区来实现这个转换即使用java 创建的临时文件 使用 MultipartFile.transferto()方法 。
        File file = null;
        try {
            String originalFilename = multipartFile.getOriginalFilename();
            String[] filename = originalFilename.split(".");
            file = File.createTempFile(filename[0], filename[1]);
            multipartFile.transferTo(file);
            file.deleteOnExit();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return file;
    }

    /**
     * 文件或文件夹重命名
     *
     * @param oldPath
     * @param newPath
     */
    public void folderRename(String oldPath, String newPath) {
        File file = new File(oldPath);
        System.out.println(file.exists());
        file.renameTo(new File(newPath));
//        if (file.exists()){
//            createFolder(newPath);
//        } else {
//            file.renameTo(new File(newPath));
//        }

    }
}

